package cn.study.forkjointest.recursiveaction;


import cn.study.forkjointest.util.Utils;

import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;

public class ArrayToSortMain {

    public static void main(String[] args) {
        /**
         * 单线程-归并排序
         */
        //生成测试数组  用于归并排序
        int[] arrayToSortByMergeSort = Utils.buildRandomIntArray(20_000_000);
        //生成测试数组  用于forkjoin排序
        int[] arrayToSortByForkJoin = Arrays.copyOf(arrayToSortByMergeSort, arrayToSortByMergeSort.length);
        //生成测试数组  用于快速排序
        int[] arrayToSortByQuick = Arrays.copyOf(arrayToSortByMergeSort, arrayToSortByMergeSort.length);

        long startTime = System.nanoTime();
        // 快速排序
        Arrays.sort(arrayToSortByQuick);
        long duration = System.nanoTime()-startTime;
        System.out.println("单线程快速排序时间: "+(duration/(1000f*1000f))+"毫秒");

        //获取处理器数量
        int processors = Runtime.getRuntime().availableProcessors();

        MergeSort mergeSort = new MergeSort(arrayToSortByMergeSort, 20000);
        startTime = System.nanoTime();
        // 归并排序
        mergeSort.mergeSort();
        duration = System.nanoTime()-startTime;
        System.out.println("单线程归并排序时间: "+(duration/(1000f*1000f))+"毫秒");

        /**
         * 多线程并行-
         */
        //利用forkjoin排序  第一步构建一个任务
        MergeSortTask mergeSortTask = new MergeSortTask(arrayToSortByForkJoin, 20000);
        // 第二步：构建forkjoin线程池
        ForkJoinPool forkJoinPool = new ForkJoinPool(processors);
        startTime = System.nanoTime();
        //第三步：提交我们任务，执行排序任务
        forkJoinPool.invoke(mergeSortTask);
        duration = System.nanoTime()-startTime;
        System.out.println("forkjoin排序时间: "+(duration/(1000f*1000f))+"毫秒");

    }
}
